#define  _CRT_SECURE_NO_WARNINGS
// class Solution {
//     bool isSame(int* hs,int* hp)
//     {
//         for(int i = 0; i < 26; i++)
//             if(hs[i] != hp[i])return false;
//         return true;
//     }
// public:
//     vector<int> findAnagrams(string s, string p) {
//         int hashs[30] = {0};
//         int hashp[30] = {0};
//         vector<int> ret;
//         if(s.size() < p.size())return ret;
//         int left = 0, right = 0, len = p.size();
//         while(right < len)
//         {
//             hashs[s[right] - 'a']++;
//             hashp[p[right] - 'a']++;
//             right++;
//         }
//         while(right <= s.size())
//         {
//             if(isSame(hashs, hashp))
//             {
//                 ret.push_back(left);
//             }
//             hashs[s[left] - 'a']--;
//             if(right != s.size())hashs[s[right] - 'a']++;
//             left++, right++;
//         }
//         return ret;
//     }
// };
// class Solution {
// public:
//     vector<int> findAnagrams(string s, string p) {
//         int hashs[30] = {0};
//         int hashp[30] = {0};
//         vector<int> ret;

//         if(s.size() < p.size())return ret;

//         int left = 0, right = 0, count = 0, len = p.size();

//         while(right < len)  hashp[p[right++] - 'a']++;
//         right = 0;

//         while(right < len)
//         {
//             if(hashs[s[right] - 'a'] < hashp[s[right] - 'a']) count++;
//             hashs[s[right++] - 'a']++;
//         }
//         while(right <= s.size())
//         {
//             if(count == len) ret.push_back(left);
//             if(hashs[s[left] - 'a']-- <= hashp[s[left] - 'a'])count--;    
//             if(right != s.size() && hashs[s[right] - 'a']++ < hashp[s[right] - 'a'])count++;
//             left++, right++;
//         }
//         return ret;
//     }
// };
class Solution {
public:
    vector<int> findAnagrams(string s, string p)
    {
        vector<int> ret;
        if (s.size() < p.size())return ret;

        int hashp[26] = { 0 };
        for (auto ch : p) hashp[ch - 'a']++;

        int hashs[26] = { 0 };
        for (int left = 0, right = 0, count = 0; right < s.size(); right++)
        {
            int i1 = s[right] - 'a';
            if (hashs[i1]++ < hashp[i1])count++;
            if (right - left + 1 > p.size())
            {
                int i2 = s[left++] - 'a';
                if (hashs[i2]-- <= hashp[i2])count--;
            }
            if (count == p.size())ret.push_back(left);
        }
        return ret;
    }
};